package com.uas.model;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.lang.reflect.Field;
import java.util.*;

/**
 * created by shicr on 2017/11/19
 **/
public class ApplicationContext{

    Map<String,Object> map=new HashMap<String,Object>();

    public ApplicationContext (String file) throws Exception{
        //创建saxReader对象
        SAXReader reader=new SAXReader();
        //读取文件,转换成document
        Document document=reader.read(new File(file));
        //获取根节点元素对象，即beans
        Element root=document.getRootElement();
        //遍历
        listNodes(root);
    }
    //遍历当前节点下的所有节点
    public void listNodes(Element node) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        //获取当前遍历的根节点的名称
        String nodeName=node.getName();
        //首先获取当前节点的所有属性节点
        List<Attribute> attributes=node.attributes();
        //遍历当前属性节点是bean的话
        if("bean".equals(nodeName)){
            //bean对象的特征键值对
            Map<String,String> attributemap=new HashMap<String, String>();

            //遍历属性节点
            for(Attribute attribute:attributes){
                //将bean属性的名称和值存入attributemap当中
                attributemap.put(attribute.getName(),attribute.getValue());

                    //获取bean的名称和值，反射建立类
                    if(attributemap.containsKey("id")&&attributemap.containsKey("class")){
                        String id=attributemap.get("id");
                        String className=attributemap.get("class");
                        Class clazz=Class.forName(className);
                        //建立类实体
                        Object o=clazz.newInstance();
                        List<Element> elements=node.elements();
                        Map<String,String> mapProperty=new HashMap<String,String>();
                        //获得类中所有属性的进行遍历
                        for(Field f:clazz.getDeclaredFields()){
                            //设置属性是可访问的
                            f.setAccessible(true); //设置些属性是可以访问的
                            for(Element e:elements){
                      /*          List<Element> e1=e.elements();
                                for(Element e2:e1){
                                    if("map".equals(e2.getName())){
                                        System.out.println("yes");
                                        List<Element> e3=e2.elements();
                                        for(Element e4:e3){
                                            if("entry".equals(e4.getName())){
                                                System.out.println("no");
                                                if(f.getName().equals(e.attributeValue("name"))){

                                                }
                                            }
                                        }
                                    }
                                }*/
                            /*    mapProperty.put(e.getName(),)*/
                                if(f.getName().equals(e.attributeValue("name"))){
                                    String c = f.getType().getName();
                                    //System.out.println("类属性"+c);
                                    String value = e.attributeValue("value");
                                    if(c.equals("java.lang.Integer") || c.equals("int")){
                                        f.set(o, Integer.valueOf(value));
                                    }else if(c.equals("java.lang.Double")||c.equals("double")){
                                        f.set(o,Double.valueOf(value));
                                    }else if(c.equals("java.lang.Long")||c.equals("long")){
                                        f.set(o,Long.valueOf(value));
                                    }else if(c.equals("java.lang.Float")||c.equals("float")){
                                        f.set(o,Float.valueOf(value));
                                    }else{
                                        f.set(o,value);
                                    }

                                }
                          /*  System.out.println(e.attributeValue("name"));
                            System.out.println(e.attributeValue("value"));*/
                            }
                        }
                        map.put(id,o);
                    }
                }
        }

        //同时迭代当前节点下面的所有子节点
        //使用递归
        Iterator<Element> iterator = node.elementIterator();
        while(iterator.hasNext()){
            Element e = iterator.next();
            listNodes(e);
        }

    }

    public Object getBean(String bean){

       boolean flag=map.containsKey(bean);
       if(flag){
           Object o=map.get(bean);

           return o;
       }
       return null;
    }


}
